Bibliotecas

library(psych)
library(corrplot)
corrplot 0.92 loaded
library(haven)
library(dplyr)
library(magrittr)

Leitura dos dados

dados <- readRDS(here("data", "STU_QQQ_5.rds"))
dados

Omissos de cada coluna

colSums(is.na(dados))
     PV1SCIE      PV1READ      PV1MATH      SOCONPA      BODYIMA     GCAWAREP     INTCULTP 
        5377        41320         5377       534956       536507       612004       612004 
     ATTIMMP     JOYREADP      PRESUPP     PASCHPOL     PQSCHOOL      EMOSUPP      CURSUPP 
      612004       520815       519825       520641       519999       520772       519740 
    FLFAMILY     FLSCHOOL     FLCONICT     FLCONFIN     INFOJOB2     INFOJOB1      INFOCAR 
      612004       612004       612004       612004       390359       390359       382412 
  ICTOUTSIDE     ICTCLASS      SOIAICT       AUTICT      COMPICT       INTICT       USESCH 
      283481       275263       310331       306205       299011       292761       298901 
     HOMESCH       ENTUSE BEINGBULLIED       BELONG      DISCRIM     GLOBMIND       AWACOM 
      288643       271459       147660        77867       612004       612004       612004 
     RESPECT      COGFLEX     PERSPECT      INTCULT       ATTIMM      GCAWARE    GCSELFEFF 
      612004       612004       612004       612004       612004       612004       612004 
    MASTGOAL   RESILIENCE         SWBP        EUDMO      GFOFAIL     WORKMAST      COMPETE 
       71452        74444       124918       105309        69899        66094        55755 
    ATTLNACT      PERCOOP      PERCOMP     PISADIFF   SCREADDIFF   SCREADCOMP      JOYREAD 
       46324       147207       132669        59460        73950        70810        38233 
    TEACHINT   ADAPTIVITY     STIMREAD      EMOSUPS      PERFEED       DIRINS     TEACHSUP 
       60699        44478        43247       129289        64409        57856        60365 
    DISCLIMA       ICTRES       WEALTH       HEDRES     CULTPOSS      HOMEPOS       ICTSCH 
       32662        15676        13737        17705        23446        11400       256547 
     ICTHOME         ESCS       STUBMI       CHANGE     SCCHANGE     FCFMLRTY        TMINS 
      249475        14379       540769       381656       379993       612004       222268 
       SMINS        LMINS        MMINS          AGE        GRADE   ST061Q01NA   ST060Q01NA 
      148178       143593       143986            0         3019       118181       144404 
  ST059Q03TA   ST059Q02TA   ST059Q01TA   ST016Q01NA        IMMIG        HISEI        BFMJ2 
      136286       131373       130630       118802        32568        47647       110980 
       BMMJ1       HISCED       FISCED       MISCED       ISCEDL    ST001D01T       REPEAT 
       84576        17657        32575        21433         6869            0        36532 
       PROGN        OCOD3        OCOD2        OCOD1    ST004D01T          CNT 
           0            0            0            0            2            0 
# A coluna dos Paises não tem nulos
sum(is.na(dados$CNT))
[1] 0

Países Existentes na base de dados

unique(dados$CNT)
<labelled<character>[80]>: Country code 3-character
 [1] ALB ARE ARG AUS AUT BEL BGR BIH BLR BRA BRN CAN CHE CHL COL CRI CZE DEU DNK DOM ESP EST FIN
[24] FRA GBR GEO GRC HKG HRV HUN IDN IRL ISL ISR ITA JOR JPN KAZ KOR KSV LBN LTU LUX LVA MAC MAR
[47] MDA MEX MKD MLT MNE MYS NLD NOR NZL PAN PER PHL POL PRT QAT QAZ QCI QMR QRT ROU RUS SAU SGP
[70] SRB SVK SVN SWE TAP THA TUR UKR URY USA VNM

Labels:

Visualização das características de cada um dos países

dados %>%
  mutate(NumNulos = rowSums(is.na(.))) %>%
  group_by(CNT) %>%
  summarize(TotalNulos = sum(NumNulos),
            NumLinhas = n(),
            PercentNulos = (TotalNulos / (NumLinhas * ncol(dados))) * 100,
            MeanScience = mean(PV1SCIE, na.rm = TRUE),
            MeanRead = mean(PV1READ, na.rm = TRUE),
            MeanMath = mean(PV1MATH, na.rm = TRUE),
            .groups = "drop") %>% 
  arrange(desc(NumLinhas))
mutate: new variable 'NumNulos' (double) with 75 unique values and 0% NA
group_by: one grouping variable (CNT)
summarize: now 80 rows and 7 columns, ungrouped

Irlanda

Irlanda <- dados %>% filter(CNT == "IRL")
filter: removed 606,427 rows (99%), 5,577 rows remaining
Irlanda

Características da Irlanda

dim(Irlanda)
describe(Irlanda)

Limpeza dos valores omissos

IrlandaSemiLimpa <- Irlanda %>% select(where(~ !all(is.na(.))))
select: dropped 18 variables (GCAWAREP, INTCULTP, ATTIMMP, FLFAMILY, FLSCHOOL, …)
dim(IrlandaSemiLimpa)
[1] 5577   86
IrlandaLimpa <- na.omit(IrlandaSemiLimpa)
dim(IrlandaLimpa)
[1] 1133   86
Irlanda <- IrlandaLimpa %>% select_if(is.numeric)
select_if: dropped 5 variables (PROGN, OCOD3, OCOD2, OCOD1, CNT)
rm(IrlandaLimpa)
rm(IrlandaSemiLimpa)
Irlanda
describe(Irlanda)

Outliers

identificar_outliers <- function(coluna) {
  desvio_padrao <- sd(coluna)
  limite_superior <- mean(coluna) + 3 * desvio_padrao
  limite_inferior <- mean(coluna) - 3 * desvio_padrao
  outliers <- coluna < limite_inferior | coluna > limite_superior
  return(outliers)
}

# Identificar outliers em cada coluna
outliers_por_coluna <- lapply(Irlanda, identificar_outliers)

# Mostrar os valores outliers em cada coluna
for (i in 1:length(outliers_por_coluna)) {
  coluna <- outliers_por_coluna[[i]]
  coluna_outliers <- Irlanda[coluna, i]
  if (length(coluna_outliers) > 0) {
    print(paste("Coluna:", names(Irlanda)[i]))
    print(coluna_outliers)
  }
}

Tratamento dos dados

Após realizada a limpeza dos dados, podemos então passar finalmente para a criação de PCA, a fim de se conseguir reduzir a dimensionalidade da base de dados, que possui 86 colunas. Antes de prosseguir, é necessário reter alguns pontos sobre como aplicar o PCA:

  1. O PCA é mais eficaz quando as variáveis estão correlacionadas entre si.

  2. Antes de aplicar o PCA, é importante verificar se as variáveis estão em escalas comparáveis. Variáveis em diferentes escalas podem ter diferentes variações e isso pode distorcer a análise do PCA.

Correlações das colunas

#Correlation plot with colors (too many attributes)
correlation <- cor(Irlanda)
corrplot(correlation)


#Correlation matrix
round(correlation, 3)

KMO measure

KMO(correlation)
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = correlation)
Overall MSA =  0.72
MSA for each item = 
     PV1SCIE      PV1READ      PV1MATH      SOCONPA      BODYIMA     JOYREADP      PRESUPP 
        0.81         0.82         0.85         0.81         0.85         0.83         0.66 
    PASCHPOL     PQSCHOOL      EMOSUPP      CURSUPP     INFOJOB2     INFOJOB1      INFOCAR 
        0.58         0.60         0.75         0.80         0.62         0.88         0.89 
  ICTOUTSIDE     ICTCLASS      SOIAICT       AUTICT      COMPICT       INTICT       USESCH 
        0.74         0.74         0.84         0.77         0.77         0.80         0.81 
     HOMESCH       ENTUSE BEINGBULLIED       BELONG     MASTGOAL   RESILIENCE         SWBP 
        0.76         0.79         0.73         0.84         0.84         0.87         0.85 
       EUDMO      GFOFAIL     WORKMAST      COMPETE     ATTLNACT      PERCOOP      PERCOMP 
        0.86         0.78         0.86         0.75         0.79         0.88         0.75 
    PISADIFF   SCREADDIFF   SCREADCOMP      JOYREAD     TEACHINT   ADAPTIVITY     STIMREAD 
        0.90         0.83         0.87         0.88         0.86         0.89         0.88 
     EMOSUPS      PERFEED       DIRINS     TEACHSUP     DISCLIMA       ICTRES       WEALTH 
        0.82         0.86         0.86         0.86         0.77         0.89         0.62 
      HEDRES     CULTPOSS      HOMEPOS       ICTSCH      ICTHOME         ESCS       STUBMI 
        0.63         0.63         0.66         0.75         0.93         0.75         0.61 
      CHANGE     SCCHANGE        TMINS        SMINS        LMINS        MMINS          AGE 
        0.56         0.55         0.33         0.57         0.48         0.49         0.90 
       GRADE   ST061Q01NA   ST060Q01NA   ST059Q03TA   ST059Q02TA   ST059Q01TA   ST016Q01NA 
        0.74         0.40         0.45         0.58         0.53         0.50         0.84 
       IMMIG        HISEI        BFMJ2        BMMJ1       HISCED       FISCED       MISCED 
        0.69         0.64         0.78         0.79         0.65         0.85         0.84 
      ISCEDL    ST001D01T       REPEAT    ST004D01T 
        0.91         0.74         0.69         0.66 

O KMO (Kaiser-Meyer-Olkin) é uma medida estatística utilizada para avaliar a adequação dos dados para realizar uma análise de fator ou análise de componentes principais (PCA). O valor do KMO varia de 0 a 1 e, quanto mais próximo de 1, melhor a adequação dos dados para uma análise de fator ou PCA. Valores de KMO acima de 0,6 são geralmente considerados adequados para análises exploratórias, enquanto valores acima de 0,8 são considerados muito bons.

Possiveis variáveis fracas

Vamos então visualizar as variáveis que não são adequadas para aplica o PCA

kmo_result <- KMO(correlation)
str(kmo_result)
List of 5
 $ MSA  : num 0.723
 $ MSAi : Named num [1:81] 0.809 0.816 0.854 0.808 0.852 ...
  ..- attr(*, "names")= chr [1:81] "PV1SCIE" "PV1READ" "PV1MATH" "SOCONPA" ...
 $ Image: num [1:81, 1:81] 1 -0.5502 -0.3359 0.052 0.0268 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:81] "PV1SCIE" "PV1READ" "PV1MATH" "SOCONPA" ...
  .. ..$ : chr [1:81] "PV1SCIE" "PV1READ" "PV1MATH" "SOCONPA" ...
 $ ImCov: num [1:81, 1:81] 0.18073 -0.09548 -0.07312 0.01733 0.00881 ...
 $ Call : language KMO(r = correlation)
 - attr(*, "class")= chr [1:2] "psych" "KMO"
# Obtém as variáveis com KMO abaixo de 0.6
low_kmo_variables <- kmo_result$MSAi[kmo_result$MSAi < 0.6]
length(low_kmo_variables)
[1] 12
low_kmo_variables
  PASCHPOL     CHANGE   SCCHANGE      TMINS      SMINS      LMINS      MMINS ST061Q01NA 
 0.5815240  0.5576719  0.5460819  0.3305456  0.5686265  0.4825795  0.4939057  0.3988630 
ST060Q01NA ST059Q03TA ST059Q02TA ST059Q01TA 
 0.4461742  0.5753859  0.5256166  0.5018066 

Possiveis variáveis fortes

# Obtém as variáveis com KMO acima, ou igual, a 0.8
high_kmo_variables <- kmo_result$MSAi[kmo_result$MSAi >= 0.8]
length(high_kmo_variables)
[1] 36
high_kmo_variables
   PV1SCIE    PV1READ    PV1MATH    SOCONPA    BODYIMA   JOYREADP    CURSUPP   INFOJOB1 
 0.8086847  0.8155320  0.8543864  0.8077840  0.8523109  0.8344543  0.8030142  0.8828375 
   INFOCAR    SOIAICT     USESCH     BELONG   MASTGOAL RESILIENCE       SWBP      EUDMO 
 0.8937649  0.8366801  0.8075617  0.8383781  0.8408561  0.8733766  0.8537895  0.8588286 
  WORKMAST    PERCOOP   PISADIFF SCREADDIFF SCREADCOMP    JOYREAD   TEACHINT ADAPTIVITY 
 0.8611020  0.8770575  0.8960076  0.8339614  0.8706319  0.8776463  0.8610038  0.8868079 
  STIMREAD    EMOSUPS    PERFEED     DIRINS   TEACHSUP     ICTRES    ICTHOME        AGE 
 0.8793670  0.8154674  0.8639114  0.8649556  0.8557519  0.8940781  0.9263751  0.9019460 
ST016Q01NA     FISCED     MISCED     ISCEDL 
 0.8428537  0.8461257  0.8437996  0.9065449 

Teste de esfericidade de Bartlett em uma matriz de correlação.

O teste de esfericidade de Bartlett é um teste estatístico que avalia se as variáveis em um conjunto de dados estão correlacionadas entre si. Ele verifica a hipótese nula de que a matriz de correlação populacional é uma matriz de identidade, o que significa que as variáveis são independentes e não correlacionadas.

cortest.bartlett(correlation)
Warning: n not specified, 100 used
$chisq
[1] 6537.174

$p.value
[1] 7.324155e-225

$df
[1] 3240

Se o valor-p (p-value) calculado no teste de esfericidade de Bartlett for menor que 0.05, isso sugere evidências estatísticas para rejeitar a hipótese nula de que as variáveis são independentes e não correlacionadas, por outras palavras, existe uma correlação significativa entre as variáveis em questão. Isso significa que as variáveis não podem ser consideradas independentes e que existe algum grau de relação entre elas.

Estandardizar os dados

data_scaled <- scale(Irlanda)
data_scaled %>% glimpse()
 num [1:1133, 1:81] 0.62 -2.055 0.787 1.03 0.446 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:81] "PV1SCIE" "PV1READ" "PV1MATH" "SOCONPA" ...
 - attr(*, "scaled:center")= Named num [1:81] 546.789 568.293 543.74 0.207 -0.175 ...
  ..- attr(*, "names")= chr [1:81] "PV1SCIE" "PV1READ" "PV1MATH" "SOCONPA" ...
 - attr(*, "scaled:scale")= Named num [1:81] 77.575 79.867 67.508 0.874 0.902 ...
  ..- attr(*, "names")= chr [1:81] "PV1SCIE" "PV1READ" "PV1MATH" "SOCONPA" ...

PCA

Nesta parte, passaremos então para o processo de criação de PCA’s. Podemos então começar por pensar algumas ideias por alto, podendo ser estas:

Colunas

colunas <- colnames(data_scaled)
colunas
 [1] "PV1SCIE"      "PV1READ"      "PV1MATH"      "SOCONPA"      "BODYIMA"      "JOYREADP"    
 [7] "PRESUPP"      "PASCHPOL"     "PQSCHOOL"     "EMOSUPP"      "CURSUPP"      "INFOJOB2"    
[13] "INFOJOB1"     "INFOCAR"      "ICTOUTSIDE"   "ICTCLASS"     "SOIAICT"      "AUTICT"      
[19] "COMPICT"      "INTICT"       "USESCH"       "HOMESCH"      "ENTUSE"       "BEINGBULLIED"
[25] "BELONG"       "MASTGOAL"     "RESILIENCE"   "SWBP"         "EUDMO"        "GFOFAIL"     
[31] "WORKMAST"     "COMPETE"      "ATTLNACT"     "PERCOOP"      "PERCOMP"      "PISADIFF"    
[37] "SCREADDIFF"   "SCREADCOMP"   "JOYREAD"      "TEACHINT"     "ADAPTIVITY"   "STIMREAD"    
[43] "EMOSUPS"      "PERFEED"      "DIRINS"       "TEACHSUP"     "DISCLIMA"     "ICTRES"      
[49] "WEALTH"       "HEDRES"       "CULTPOSS"     "HOMEPOS"      "ICTSCH"       "ICTHOME"     
[55] "ESCS"         "STUBMI"       "CHANGE"       "SCCHANGE"     "TMINS"        "SMINS"       
[61] "LMINS"        "MMINS"        "AGE"          "GRADE"        "ST061Q01NA"   "ST060Q01NA"  
[67] "ST059Q03TA"   "ST059Q02TA"   "ST059Q01TA"   "ST016Q01NA"   "IMMIG"        "HISEI"       
[73] "BFMJ2"        "BMMJ1"        "HISCED"       "FISCED"       "MISCED"       "ISCEDL"      
[79] "ST001D01T"    "REPEAT"       "ST004D01T"   
correlation1 <- cor(data_scaled[, -1], data_scaled[, 1])

# Definir o limite de correlação desejado
limite_correlacao <- 0.3

# Identificar as colunas com correlação forte
colunas_fortes <- row.names(correlation1)[which(abs(correlation1) > limite_correlacao)]

colunas_fortes <- append(colunas_fortes, "PV1SCIE")
  
# Exibir as colunas com correlação forte
print(colunas_fortes)
[1] "PV1READ"    "PV1MATH"    "PISADIFF"   "SCREADDIFF" "SCREADCOMP" "JOYREAD"    "PV1SCIE"   

Criação dos PCA

pc1 <- principal(data_scaled[, colunas_fortes], nfactors=length(colunas_fortes), rotate="none")
pc1$loadings

Loadings:
           PC1    PC2    PC3    PC4    PC5    PC6    PC7   
PV1READ     0.872  0.343                      -0.208 -0.268
PV1MATH     0.781  0.494                       0.361       
PISADIFF   -0.706  0.278  0.398  0.510                     
SCREADDIFF -0.668  0.541  0.229 -0.255  0.377              
SCREADCOMP  0.739 -0.449         0.269  0.420              
JOYREAD     0.603 -0.250  0.714 -0.217 -0.114              
PV1SCIE     0.844  0.421                      -0.189  0.269

                 PC1   PC2   PC3   PC4   PC5   PC6   PC7
SS loadings    3.935 1.173 0.739 0.452 0.340 0.215 0.146
Proportion Var 0.562 0.168 0.106 0.065 0.049 0.031 0.021
Cumulative Var 0.562 0.730 0.835 0.900 0.948 0.979 1.000
plot(pc1$values, type = "b", main = "Scree plot for Desempenho acadêmico",
     xlab = "Number of PC", ylab = "Eigenvalue")

round(pc1$values,3)
[1] 3.935 1.173 0.739 0.452 0.340 0.215 0.146
round(pc1$communality,3)
   PV1READ    PV1MATH   PISADIFF SCREADDIFF SCREADCOMP    JOYREAD    PV1SCIE 
         1          1          1          1          1          1          1 
#Assume the number of components = 34
pc34 <- principal(data_scaled, nfactors=3, rotate="none")
Warning: Matrix was not positive definite, smoothing was doneWarning: The matrix is not positive semi-definite, scores found from Structure loadings
pc34$loadings

Loadings:
             PC1    PC2    PC3   
PV1SCIE       0.404 -0.321 -0.255
PV1READ       0.456 -0.273 -0.260
PV1MATH       0.425 -0.297 -0.187
SOCONPA       0.273  0.255  0.162
BODYIMA       0.180  0.199  0.239
JOYREADP      0.311 -0.152 -0.143
PRESUPP       0.184              
PASCHPOL             0.218  0.106
PQSCHOOL      0.164  0.157  0.102
EMOSUPP       0.220              
CURSUPP       0.309              
INFOJOB2                         
INFOJOB1             0.577 -0.238
INFOCAR       0.155  0.481 -0.308
ICTOUTSIDE    0.134              
ICTCLASS      0.157  0.155 -0.110
SOIAICT       0.115  0.182  0.307
AUTICT        0.212         0.204
COMPICT       0.241         0.180
INTICT        0.147         0.162
USESCH               0.444       
HOMESCH       0.173  0.305       
ENTUSE        0.134  0.225  0.150
BEINGBULLIED -0.118 -0.131       
BELONG        0.225  0.231  0.275
MASTGOAL      0.408  0.166  0.211
RESILIENCE    0.371  0.270  0.306
SWBP          0.233  0.307  0.255
EUDMO         0.217  0.332  0.342
GFOFAIL                    -0.182
WORKMAST      0.317  0.262  0.231
COMPETE       0.161         0.132
ATTLNACT      0.253  0.126  0.117
PERCOOP       0.230  0.295  0.278
PERCOMP       0.131  0.161  0.133
PISADIFF     -0.403  0.111       
SCREADDIFF   -0.390              
SCREADCOMP    0.492              
JOYREAD       0.432 -0.129       
TEACHINT      0.281  0.263  0.272
ADAPTIVITY    0.282  0.327  0.373
STIMREAD      0.310  0.296  0.380
EMOSUPS       0.357  0.256  0.171
PERFEED       0.237  0.162  0.344
DIRINS        0.176  0.334  0.426
TEACHSUP      0.265  0.308  0.386
DISCLIMA      0.120  0.114  0.102
ICTRES        0.533              
WEALTH        0.458              
HEDRES        0.536              
CULTPOSS      0.606 -0.102 -0.127
HOMEPOS       0.750              
ICTSCH               0.227  0.172
ICTHOME       0.341              
ESCS          0.792 -0.286 -0.267
STUBMI                           
CHANGE                           
SCCHANGE                         
TMINS                       0.185
SMINS               -0.349  0.332
LMINS               -0.382  0.482
MMINS               -0.436  0.499
AGE                  0.424 -0.411
GRADE                0.464 -0.467
ST061Q01NA                       
ST060Q01NA                  0.186
ST059Q03TA          -0.356  0.322
ST059Q02TA          -0.477  0.512
ST059Q01TA          -0.416  0.478
ST016Q01NA    0.239  0.335  0.249
IMMIG                       0.116
HISEI         0.541 -0.314 -0.290
BFMJ2         0.498 -0.250 -0.185
BMMJ1         0.428 -0.252 -0.286
HISCED        0.524 -0.256 -0.248
FISCED        0.493 -0.247 -0.196
MISCED        0.480 -0.228 -0.259
ISCEDL               0.560 -0.568
ST001D01T            0.464 -0.467
REPEAT                      0.179
ST004D01T                   0.184

                 PC1   PC2   PC3
SS loadings    7.313 5.243 5.012
Proportion Var 0.090 0.065 0.062
Cumulative Var 0.090 0.155 0.217
#Screeplot - Find the elbow
plot(pc34$values, type = "b", main = "Scree plot for FIFA19 dataset",
     xlab = "Number of PC", ylab = "Eigenvalue") 


#Eigenvalues - Variances of the principal components 
round(pc34$values,3)
 [1] 7.313 5.243 5.012 3.919 3.486 3.117 2.958 2.342 2.257 2.070 1.854 1.805 1.688 1.610 1.431
[16] 1.398 1.276 1.218 1.159 1.097 1.085 1.020 1.002 0.966 0.948 0.911 0.905 0.865 0.822 0.781
[31] 0.759 0.747 0.732 0.715 0.695 0.666 0.652 0.645 0.643 0.623 0.597 0.586 0.576 0.559 0.542
[46] 0.524 0.507 0.495 0.482 0.472 0.463 0.456 0.432 0.425 0.414 0.410 0.398 0.375 0.369 0.359
[61] 0.341 0.338 0.336 0.317 0.294 0.278 0.239 0.173 0.169 0.157 0.142 0.114 0.088 0.065 0.029
[76] 0.025 0.011 0.010 0.003 0.001 0.000
#Using Kaiser criterion (9 component solution)
#5 component solution without rotation
pc9 <- principal(data_scaled, nfactors=9, rotate="none", scores=TRUE)
Warning: Matrix was not positive definite, smoothing was doneWarning: The matrix is not positive semi-definite, scores found from Structure loadings
#communality of 5 component solution
round(pc9$communality,3)
     PV1SCIE      PV1READ      PV1MATH      SOCONPA      BODYIMA     JOYREADP      PRESUPP 
       0.701        0.747        0.605        0.340        0.517        0.170        0.059 
    PASCHPOL     PQSCHOOL      EMOSUPP      CURSUPP     INFOJOB2     INFOJOB1      INFOCAR 
       0.103        0.138        0.160        0.208        0.120        0.491        0.500 
  ICTOUTSIDE     ICTCLASS      SOIAICT       AUTICT      COMPICT       INTICT       USESCH 
       0.195        0.143        0.443        0.489        0.470        0.263        0.386 
     HOMESCH       ENTUSE BEINGBULLIED       BELONG     MASTGOAL   RESILIENCE         SWBP 
       0.383        0.399        0.232        0.370        0.436        0.499        0.414 
       EUDMO      GFOFAIL     WORKMAST      COMPETE     ATTLNACT      PERCOOP      PERCOMP 
       0.444        0.384        0.401        0.184        0.259        0.238        0.172 
    PISADIFF   SCREADDIFF   SCREADCOMP      JOYREAD     TEACHINT   ADAPTIVITY     STIMREAD 
       0.512        0.436        0.548        0.521        0.559        0.587        0.616 
     EMOSUPS      PERFEED       DIRINS     TEACHSUP     DISCLIMA       ICTRES       WEALTH 
       0.367        0.399        0.564        0.634        0.265        0.670        0.709 
      HEDRES     CULTPOSS      HOMEPOS       ICTSCH      ICTHOME         ESCS       STUBMI 
       0.432        0.439        0.869        0.173        0.470        0.942        0.064 
      CHANGE     SCCHANGE        TMINS        SMINS        LMINS        MMINS          AGE 
       0.347        0.354        0.117        0.532        0.597        0.604        0.486 
       GRADE   ST061Q01NA   ST060Q01NA   ST059Q03TA   ST059Q02TA   ST059Q01TA   ST016Q01NA 
       0.880        0.186        0.280        0.562        0.760        0.720        0.557 
       IMMIG        HISEI        BFMJ2        BMMJ1       HISCED       FISCED       MISCED 
       0.217        0.667        0.427        0.464        0.674        0.511        0.561 
      ISCEDL    ST001D01T       REPEAT    ST004D01T 
       0.910        0.880        0.098        0.417 
#5 component solution with rotation (varimax)
pc9r <- principal(data_scaled, nfactors=9, rotate="varimax")
Warning: Matrix was not positive definite, smoothing was doneWarning: The matrix is not positive semi-definite, scores found from Structure loadings
pc9r$loadings

Loadings:
             RC1    RC4    RC2    RC5    RC3    RC7    RC6    RC9    RC8   
PV1SCIE       0.201  0.802                      -0.117                     
PV1READ       0.181  0.820                      -0.131                0.129
PV1MATH       0.205  0.747                                                 
SOCONPA                                   0.120  0.403 -0.141  0.146  0.338
BODYIMA                                          0.681               -0.177
JOYREADP      0.252  0.213                                     0.102  0.174
PRESUPP       0.113                                                   0.199
PASCHPOL                                  0.248                       0.156
PQSCHOOL                                  0.286                       0.208
EMOSUPP       0.113                                    -0.105         0.358
CURSUPP       0.204                                                   0.385
INFOJOB2                                                0.323              
INFOJOB1            -0.128  0.647 -0.127  0.108  0.144                     
INFOCAR                     0.641 -0.108                0.214         0.166
ICTOUTSIDE                                0.114 -0.169  0.342         0.147
ICTCLASS                          -0.180                0.250  0.108  0.113
SOIAICT                                          0.184  0.608        -0.136
AUTICT               0.293                              0.592        -0.175
COMPICT              0.268                              0.604              
INTICT               0.126                              0.489              
USESCH              -0.238  0.345 -0.164                0.386         0.149
HOMESCH             -0.304  0.133         0.147         0.390  0.139  0.269
ENTUSE              -0.102                              0.596  0.138       
BEINGBULLIED                             -0.124 -0.338  0.295              
BELONG                                           0.597                     
MASTGOAL             0.146                0.152  0.160  0.165         0.576
RESILIENCE           0.165                       0.585  0.258         0.236
SWBP                                             0.586                0.230
EUDMO               -0.158                0.102  0.587  0.114         0.224
GFOFAIL                                         -0.547                0.271
WORKMAST             0.135                       0.279  0.205         0.497
COMPETE              0.157                       0.221  0.323              
ATTLNACT                                                              0.483
PERCOOP                                   0.254  0.317                0.247
PERCOMP                                                 0.293         0.238
PISADIFF            -0.691                                                 
SCREADDIFF          -0.623                      -0.106               -0.121
SCREADCOMP           0.666                0.113         0.150         0.233
JOYREAD       0.160  0.471                0.149 -0.219                0.441
TEACHINT                                  0.725                       0.136
ADAPTIVITY                                0.741  0.177                     
STIMREAD                                  0.766                       0.120
EMOSUPS                                   0.126  0.338         0.108  0.472
PERFEED                                   0.606         0.125              
DIRINS                                    0.726  0.126                     
TEACHSUP                                  0.781  0.132                     
DISCLIMA                    0.114  0.102  0.442        -0.197              
ICTRES        0.252                                     0.179  0.754       
WEALTH        0.186                                     0.126  0.804       
HEDRES        0.228                       0.144         0.156  0.512  0.244
CULTPOSS      0.413  0.197                              0.110  0.348  0.287
HOMEPOS       0.411  0.117                              0.154  0.781  0.218
ICTSCH              -0.285                0.154         0.184  0.134       
ICTHOME       0.155 -0.158                              0.141  0.624       
ESCS          0.861  0.122                                     0.413  0.111
STUBMI                            -0.112               -0.107         0.163
CHANGE        0.189 -0.236                              0.353 -0.342       
SCCHANGE      0.206 -0.162                              0.338 -0.387       
TMINS                              0.297                                   
SMINS                0.184         0.693                             -0.103
LMINS        -0.109        -0.172  0.721                             -0.141
MMINS                      -0.249  0.703                             -0.160
AGE                         0.680 -0.131                                   
GRADE                       0.928                                          
ST061Q01NA           0.130        -0.263  0.122         0.108  0.102 -0.228
ST060Q01NA          -0.160         0.429                              0.199
ST059Q03TA           0.139         0.733                                   
ST059Q02TA                 -0.221  0.840                                   
ST059Q01TA                 -0.141  0.832                                   
ST016Q01NA                                       0.721                0.102
IMMIG                              0.142        -0.112  0.333 -0.222       
HISEI         0.793  0.113                             -0.111  0.107       
BFMJ2         0.624  0.132                                     0.122       
BMMJ1         0.659                                    -0.105              
HISCED        0.816                                                        
FISCED        0.706                                                        
MISCED        0.740                                                        
ISCEDL                      0.939 -0.149                                   
ST001D01T                   0.928                                          
REPEAT                     -0.174                       0.121 -0.179       
ST004D01T                  -0.107                0.331  0.179        -0.508

                RC1   RC4   RC2   RC5   RC3   RC7   RC6   RC9   RC8
SS loadings    4.89 4.438 4.373 4.050 3.928 3.822 3.565 3.389 3.190
Proportion Var 0.06 0.055 0.054 0.050 0.048 0.047 0.044 0.042 0.039
Cumulative Var 0.06 0.115 0.169 0.219 0.268 0.315 0.359 0.401 0.440
LS0tDQp0aXRsZTogIlByb2pldG8iDQphdXRob3I6ICJncnVwbyA2c2lnbWEiDQpkYXRlOiAiMjAyMy0wNS0xMCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyBCaWJsaW90ZWNhcw0KYGBge3J9DQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShtYWdyaXR0cikNCmBgYA0KDQojIExlaXR1cmEgZG9zIGRhZG9zDQpgYGB7cn0NCmRhZG9zIDwtIHJlYWRSRFMoaGVyZSgiZGF0YSIsICJTVFVfUVFRXzUucmRzIikpDQpkYWRvcw0KYGBgDQojIyBPbWlzc29zIGRlIGNhZGEgY29sdW5hDQpgYGB7cn0NCmNvbFN1bXMoaXMubmEoZGFkb3MpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBBIGNvbHVuYSBkb3MgUGFpc2VzIG7Do28gdGVtIG51bG9zDQpzdW0oaXMubmEoZGFkb3MkQ05UKSkNCmBgYA0KDQojIyBQYcOtc2VzIEV4aXN0ZW50ZXMgbmEgYmFzZSBkZSBkYWRvcw0KYGBge3J9DQp1bmlxdWUoZGFkb3MkQ05UKQ0KYGBgDQoNCiMjIyBWaXN1YWxpemHDp8OjbyBkYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBjYWRhIHVtIGRvcyBwYcOtc2VzDQpgYGB7cn0NCmRhZG9zICU+JQ0KICBtdXRhdGUoTnVtTnVsb3MgPSByb3dTdW1zKGlzLm5hKC4pKSkgJT4lDQogIGdyb3VwX2J5KENOVCkgJT4lDQogIHN1bW1hcml6ZShUb3RhbE51bG9zID0gc3VtKE51bU51bG9zKSwNCiAgICAgICAgICAgIE51bUxpbmhhcyA9IG4oKSwNCiAgICAgICAgICAgIFBlcmNlbnROdWxvcyA9IChUb3RhbE51bG9zIC8gKE51bUxpbmhhcyAqIG5jb2woZGFkb3MpKSkgKiAxMDAsDQogICAgICAgICAgICBNZWFuU2NpZW5jZSA9IG1lYW4oUFYxU0NJRSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIE1lYW5SZWFkID0gbWVhbihQVjFSRUFELCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgTWVhbk1hdGggPSBtZWFuKFBWMU1BVEgsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhOdW1MaW5oYXMpKQ0KYGBgDQoNCiMgSXJsYW5kYQ0KYGBge3J9DQpJcmxhbmRhIDwtIGRhZG9zICU+JSBmaWx0ZXIoQ05UID09ICJJUkwiKQ0KSXJsYW5kYQ0KYGBgDQoNCiMjIENhcmFjdGVyw61zdGljYXMgZGEgSXJsYW5kYQ0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KZGltKElybGFuZGEpDQpkZXNjcmliZShJcmxhbmRhKQ0KYGBgDQoNCiMjIExpbXBlemEgZG9zIHZhbG9yZXMgb21pc3Nvcw0KYGBge3J9DQpJcmxhbmRhU2VtaUxpbXBhIDwtIElybGFuZGEgJT4lIHNlbGVjdCh3aGVyZSh+ICFhbGwoaXMubmEoLikpKSkNCmRpbShJcmxhbmRhU2VtaUxpbXBhKQ0KYGBgDQoNCmBgYHtyfQ0KSXJsYW5kYUxpbXBhIDwtIG5hLm9taXQoSXJsYW5kYVNlbWlMaW1wYSkNCmRpbShJcmxhbmRhTGltcGEpDQpgYGANCg0KYGBge3J9DQpJcmxhbmRhIDwtIElybGFuZGFMaW1wYSAlPiUgc2VsZWN0X2lmKGlzLm51bWVyaWMpDQpybShJcmxhbmRhTGltcGEpDQpybShJcmxhbmRhU2VtaUxpbXBhKQ0KYGBgDQoNCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCklybGFuZGENCmRlc2NyaWJlKElybGFuZGEpDQpgYGANCiMjIE91dGxpZXJzDQoNCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCmlkZW50aWZpY2FyX291dGxpZXJzIDwtIGZ1bmN0aW9uKGNvbHVuYSkgew0KICBkZXN2aW9fcGFkcmFvIDwtIHNkKGNvbHVuYSkNCiAgbGltaXRlX3N1cGVyaW9yIDwtIG1lYW4oY29sdW5hKSArIDMgKiBkZXN2aW9fcGFkcmFvDQogIGxpbWl0ZV9pbmZlcmlvciA8LSBtZWFuKGNvbHVuYSkgLSAzICogZGVzdmlvX3BhZHJhbw0KICBvdXRsaWVycyA8LSBjb2x1bmEgPCBsaW1pdGVfaW5mZXJpb3IgfCBjb2x1bmEgPiBsaW1pdGVfc3VwZXJpb3INCiAgcmV0dXJuKG91dGxpZXJzKQ0KfQ0KDQojIElkZW50aWZpY2FyIG91dGxpZXJzIGVtIGNhZGEgY29sdW5hDQpvdXRsaWVyc19wb3JfY29sdW5hIDwtIGxhcHBseShJcmxhbmRhLCBpZGVudGlmaWNhcl9vdXRsaWVycykNCg0KIyBNb3N0cmFyIG9zIHZhbG9yZXMgb3V0bGllcnMgZW0gY2FkYSBjb2x1bmENCmZvciAoaSBpbiAxOmxlbmd0aChvdXRsaWVyc19wb3JfY29sdW5hKSkgew0KICBjb2x1bmEgPC0gb3V0bGllcnNfcG9yX2NvbHVuYVtbaV1dDQogIGNvbHVuYV9vdXRsaWVycyA8LSBJcmxhbmRhW2NvbHVuYSwgaV0NCiAgaWYgKGxlbmd0aChjb2x1bmFfb3V0bGllcnMpID4gMCkgew0KICAgIHByaW50KHBhc3RlKCJDb2x1bmE6IiwgbmFtZXMoSXJsYW5kYSlbaV0pKQ0KICAgIHByaW50KGNvbHVuYV9vdXRsaWVycykNCiAgfQ0KfQ0KYGBgDQoNCiMgVHJhdGFtZW50byBkb3MgZGFkb3MNCiAgQXDDs3MgcmVhbGl6YWRhIGEgbGltcGV6YSBkb3MgZGFkb3MsIHBvZGVtb3MgZW50w6NvIHBhc3NhciBmaW5hbG1lbnRlIHBhcmEgYSBjcmlhw6fDo28gZGUgUENBLCBhIGZpbSBkZSBzZSBjb25zZWd1aXIgcmVkdXppciBhIGRpbWVuc2lvbmFsaWRhZGUgZGEgYmFzZSBkZSBkYWRvcywgcXVlIHBvc3N1aSA4NiBjb2x1bmFzLg0KICBBbnRlcyBkZSBwcm9zc2VndWlyLCDDqSBuZWNlc3PDoXJpbyByZXRlciBhbGd1bnMgcG9udG9zIHNvYnJlIGNvbW8gYXBsaWNhciBvIFBDQToNCg0KICAxLiBPIFBDQSDDqSBtYWlzIGVmaWNheiBxdWFuZG8gYXMgdmFyacOhdmVpcyBlc3TDo28gY29ycmVsYWNpb25hZGFzIGVudHJlIHNpLg0KDQogIDIuIEFudGVzIGRlIGFwbGljYXIgbyBQQ0EsIMOpIGltcG9ydGFudGUgdmVyaWZpY2FyIHNlIGFzIHZhcmnDoXZlaXMgZXN0w6NvIGVtIGVzY2FsYXMgY29tcGFyw6F2ZWlzLiBWYXJpw6F2ZWlzIGVtIGRpZmVyZW50ZXMgZXNjYWxhcyBwb2RlbSB0ZXIgZGlmZXJlbnRlcyB2YXJpYcOnw7VlcyBlIGlzc28gcG9kZSBkaXN0b3JjZXIgYSBhbsOhbGlzZSBkbyBQQ0EuDQogIA0KIyMgQ29ycmVsYcOnw7VlcyBkYXMgY29sdW5hcw0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KI0NvcnJlbGF0aW9uIHBsb3Qgd2l0aCBjb2xvcnMgKHRvbyBtYW55IGF0dHJpYnV0ZXMpDQpjb3JyZWxhdGlvbiA8LSBjb3IoSXJsYW5kYSkNCmNvcnJwbG90KGNvcnJlbGF0aW9uKQ0KDQojQ29ycmVsYXRpb24gbWF0cml4DQpyb3VuZChjb3JyZWxhdGlvbiwgMykNCmBgYA0KDQojIyBLTU8gbWVhc3VyZQ0KYGBge3J9DQpLTU8oY29ycmVsYXRpb24pDQpgYGANCk8gS01PIChLYWlzZXItTWV5ZXItT2xraW4pIMOpIHVtYSBtZWRpZGEgZXN0YXTDrXN0aWNhIHV0aWxpemFkYSBwYXJhIGF2YWxpYXIgYSBhZGVxdWHDp8OjbyBkb3MgZGFkb3MgcGFyYSByZWFsaXphciB1bWEgYW7DoWxpc2UgZGUgZmF0b3Igb3UgYW7DoWxpc2UgZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFpcyAoUENBKS4NCk8gdmFsb3IgZG8gS01PIHZhcmlhIGRlIDAgYSAxIGUsIHF1YW50byBtYWlzIHByw7N4aW1vIGRlIDEsIG1lbGhvciBhIGFkZXF1YcOnw6NvIGRvcyBkYWRvcyBwYXJhIHVtYSBhbsOhbGlzZSBkZSBmYXRvciBvdSBQQ0EuIFZhbG9yZXMgZGUgS01PIGFjaW1hIGRlIDAsNiBzw6NvIGdlcmFsbWVudGUgY29uc2lkZXJhZG9zIGFkZXF1YWRvcyBwYXJhIGFuw6FsaXNlcyBleHBsb3JhdMOzcmlhcywgZW5xdWFudG8gdmFsb3JlcyBhY2ltYSBkZSAwLDggc8OjbyBjb25zaWRlcmFkb3MgbXVpdG8gYm9ucy4NCg0KIyMjIFBvc3NpdmVpcyB2YXJpw6F2ZWlzIGZyYWNhcw0KVmFtb3MgZW50w6NvIHZpc3VhbGl6YXIgYXMgdmFyacOhdmVpcyBxdWUgbsOjbyBzw6NvIGFkZXF1YWRhcyBwYXJhIGFwbGljYSBvIFBDQQ0KDQpgYGB7cn0NCmttb19yZXN1bHQgPC0gS01PKGNvcnJlbGF0aW9uKQ0Kc3RyKGttb19yZXN1bHQpDQojIE9idMOpbSBhcyB2YXJpw6F2ZWlzIGNvbSBLTU8gYWJhaXhvIGRlIDAuNg0KbG93X2ttb192YXJpYWJsZXMgPC0ga21vX3Jlc3VsdCRNU0FpW2ttb19yZXN1bHQkTVNBaSA8IDAuNl0NCmxlbmd0aChsb3dfa21vX3ZhcmlhYmxlcykNCmxvd19rbW9fdmFyaWFibGVzDQpgYGANCiMjIyBQb3NzaXZlaXMgdmFyacOhdmVpcyBmb3J0ZXMNCg0KYGBge3J9DQojIE9idMOpbSBhcyB2YXJpw6F2ZWlzIGNvbSBLTU8gYWNpbWEsIG91IGlndWFsLCBhIDAuOA0KaGlnaF9rbW9fdmFyaWFibGVzIDwtIGttb19yZXN1bHQkTVNBaVtrbW9fcmVzdWx0JE1TQWkgPj0gMC44XQ0KbGVuZ3RoKGhpZ2hfa21vX3ZhcmlhYmxlcykNCmhpZ2hfa21vX3ZhcmlhYmxlcw0KYGBgDQoNCiMjIFRlc3RlIGRlIGVzZmVyaWNpZGFkZSBkZSBCYXJ0bGV0dCBlbSB1bWEgbWF0cml6IGRlIGNvcnJlbGHDp8Ojby4NCg0KTyB0ZXN0ZSBkZSBlc2ZlcmljaWRhZGUgZGUgQmFydGxldHQgw6kgdW0gdGVzdGUgZXN0YXTDrXN0aWNvIHF1ZSBhdmFsaWEgc2UgYXMgdmFyacOhdmVpcyBlbSB1bSBjb25qdW50byBkZSBkYWRvcyBlc3TDo28gY29ycmVsYWNpb25hZGFzIGVudHJlIHNpLiBFbGUgdmVyaWZpY2EgYSBoaXDDs3Rlc2UgbnVsYSBkZSBxdWUgYSBtYXRyaXogZGUgY29ycmVsYcOnw6NvIHBvcHVsYWNpb25hbCDDqSB1bWEgbWF0cml6IGRlIGlkZW50aWRhZGUsIG8gcXVlIHNpZ25pZmljYSBxdWUgYXMgdmFyacOhdmVpcyBzw6NvIGluZGVwZW5kZW50ZXMgZSBuw6NvIGNvcnJlbGFjaW9uYWRhcy4NCg0KYGBge3J9DQpjb3J0ZXN0LmJhcnRsZXR0KGNvcnJlbGF0aW9uKQ0KYGBgDQpTZSBvIHZhbG9yLXAgKHAtdmFsdWUpIGNhbGN1bGFkbyBubyB0ZXN0ZSBkZSBlc2ZlcmljaWRhZGUgZGUgQmFydGxldHQgZm9yIG1lbm9yIHF1ZSAwLjA1LCBpc3NvIHN1Z2VyZSBldmlkw6puY2lhcyBlc3RhdMOtc3RpY2FzIHBhcmEgcmVqZWl0YXIgYSBoaXDDs3Rlc2UgbnVsYSBkZSBxdWUgYXMgdmFyacOhdmVpcyBzw6NvIGluZGVwZW5kZW50ZXMgZSBuw6NvIGNvcnJlbGFjaW9uYWRhcywgcG9yIG91dHJhcyBwYWxhdnJhcywgZXhpc3RlIHVtYSBjb3JyZWxhw6fDo28gc2lnbmlmaWNhdGl2YSBlbnRyZSBhcyB2YXJpw6F2ZWlzIGVtIHF1ZXN0w6NvLiBJc3NvIHNpZ25pZmljYSBxdWUgYXMgdmFyacOhdmVpcyBuw6NvIHBvZGVtIHNlciBjb25zaWRlcmFkYXMgaW5kZXBlbmRlbnRlcyBlIHF1ZSBleGlzdGUgYWxndW0gZ3JhdSBkZSByZWxhw6fDo28gZW50cmUgZWxhcy4NCg0KIyBFc3RhbmRhcmRpemFyIG9zIGRhZG9zDQoNCmBgYHtyfQ0KZGF0YV9zY2FsZWQgPC0gc2NhbGUoSXJsYW5kYSkNCmRhdGFfc2NhbGVkICU+JSBnbGltcHNlKCkNCmBgYA0KDQojIFBDQQ0KDQpOZXN0YSBwYXJ0ZSwgcGFzc2FyZW1vcyBlbnTDo28gcGFyYSBvIHByb2Nlc3NvIGRlIGNyaWHDp8OjbyBkZSBQQ0Ency4gUG9kZW1vcyBlbnTDo28gY29tZcOnYXIgcG9yIHBlbnNhciBhbGd1bWFzIGlkZWlhcyBwb3IgYWx0bywgcG9kZW5kbyBzZXIgZXN0YXM6DQoNCiogKipQQ0EgZGUgRGVzZW1wZW5obyBBY2Fkw6ptaWNvKio6DQogICAgLSBWYXJpw6F2ZWlzIGRlIGludGVyZXNzZTogUG9udHVhw6fDtWVzIGVtIGRpZmVyZW50ZXMgZG9tw61uaW9zIGFjYWTDqm1pY29zLCBjb21vIGxlaXR1cmEsIG1hdGVtw6F0aWNhIGUgY2nDqm5jaWFzLg0KICAgIC0gT2JqZXRpdm86IENvbXByZWVuZGVyIGEgZXN0cnV0dXJhIHN1YmphY2VudGUgZG8gZGVzZW1wZW5obyBhY2Fkw6ptaWNvIGRvcyBhbHVub3MgZSBpZGVudGlmaWNhciBwYWRyw7VlcyBnZXJhaXMgZGUgaGFiaWxpZGFkZXMgZSBjb21wZXTDqm5jaWFzLg0KDQoqICoqUENBIGRlIEZhdG9yZXMgU29jaW9lY29uw7RtaWNvcyoqOg0KICAgIC0gVmFyacOhdmVpcyBkZSBpbnRlcmVzc2U6IFZhcmnDoXZlaXMgc29jaW9lY29uw7RtaWNhcywgY29tbyBvIG7DrXZlbCBkZSBlZHVjYcOnw6NvIGRvcyBwYWlzLCBvY3VwYcOnw6NvIGRvcyBwYWlzLCByZW5kYSBmYW1pbGlhciwgYWNlc3NvIGEgcmVjdXJzb3MgZWR1Y2FjaW9uYWlzLCBldGMuDQogICAgLSBPYmpldGl2bzogRXhwbG9yYXIgYXMgcmVsYcOnw7VlcyBlbnRyZSBvcyBmYXRvcmVzIHNvY2lvZWNvbsO0bWljb3MgZSBvIGRlc2VtcGVuaG8gYWNhZMOqbWljbyBkb3MgYWx1bm9zLCBiZW0gY29tbyBpZGVudGlmaWNhciBncnVwb3MgZGUgYWx1bm9zIGNvbSBwZXJmaXMgc29jaW9lY29uw7RtaWNvcyBzZW1lbGhhbnRlcy4NCg0KKiAqKlBDQSBkZSBBdGl0dWRlcyBlIENvbXBvcnRhbWVudG9zKio6DQogICAgLSBWYXJpw6F2ZWlzIGRlIGludGVyZXNzZTogVmFyacOhdmVpcyByZWxhY2lvbmFkYXMgYSBhdGl0dWRlcywgbW90aXZhw6fDo28sIGF1dG9lZmljw6FjaWEsIGRpc2NpcGxpbmEsIHBhcnRpY2lwYcOnw6NvIGVtIGF0aXZpZGFkZXMgZXh0cmFjdXJyaWN1bGFyZXMsIGV0Yy4NCiAgICAtIE9iamV0aXZvOiBJZGVudGlmaWNhciBwYWRyw7VlcyBkZSBhdGl0dWRlcyBlIGNvbXBvcnRhbWVudG9zIGRvcyBhbHVub3MgcXVlIHBvZGVtIGluZmx1ZW5jaWFyIHNldSBkZXNlbXBlbmhvIGFjYWTDqW1pY28gZSBiZW0tZXN0YXIgZ2VyYWwuDQoNCiogKipQQ0EgZGUgQW1iaWVudGUgRXNjb2xhcioqOg0KICAgIC0gVmFyacOhdmVpcyBkZSBpbnRlcmVzc2U6IFZhcmnDoXZlaXMgcmVsYWNpb25hZGFzIGFvIGFtYmllbnRlIGVzY29sYXIsIGNvbW8gdGFtYW5obyBkYSB0dXJtYSwgcmVjdXJzb3MgZWR1Y2FjaW9uYWlzIGRpc3BvbsOtdmVpcywgY2xpbWEgZXNjb2xhciwgcmVsYWNpb25hbWVudG8gcHJvZmVzc29yLWFsdW5vLCBldGMuDQogICAgLSBPYmpldGl2bzogRXhwbG9yYXIgYSByZWxhw6fDo28gZW50cmUgbyBhbWJpZW50ZSBlc2NvbGFyIGUgbyBkZXNlbXBlbmhvIGRvcyBhbHVub3MsIGJlbSBjb21vIGlkZW50aWZpY2FyIGNhcmFjdGVyw61zdGljYXMgaW1wb3J0YW50ZXMgZG8gYW1iaWVudGUgcXVlIGFmZXRhbSBvIGFwcmVuZGl6YWRvLg0KDQojIyBDb2x1bmFzDQoNCmBgYHtyfQ0KY29sdW5hcyA8LSBjb2xuYW1lcyhkYXRhX3NjYWxlZCkNCmNvbHVuYXMNCmBgYA0KDQpgYGB7cn0NCmNvcnJlbGF0aW9uMSA8LSBjb3IoZGF0YV9zY2FsZWRbLCAtMV0sIGRhdGFfc2NhbGVkWywgMV0pDQoNCiMgRGVmaW5pciBvIGxpbWl0ZSBkZSBjb3JyZWxhw6fDo28gZGVzZWphZG8NCmxpbWl0ZV9jb3JyZWxhY2FvIDwtIDAuMw0KDQojIElkZW50aWZpY2FyIGFzIGNvbHVuYXMgY29tIGNvcnJlbGHDp8OjbyBmb3J0ZQ0KY29sdW5hc19mb3J0ZXMgPC0gcm93Lm5hbWVzKGNvcnJlbGF0aW9uMSlbd2hpY2goYWJzKGNvcnJlbGF0aW9uMSkgPiBsaW1pdGVfY29ycmVsYWNhbyldDQoNCmNvbHVuYXNfZm9ydGVzIDwtIGFwcGVuZChjb2x1bmFzX2ZvcnRlcywgIlBWMVNDSUUiKQ0KICANCiMgRXhpYmlyIGFzIGNvbHVuYXMgY29tIGNvcnJlbGHDp8OjbyBmb3J0ZQ0KcHJpbnQoY29sdW5hc19mb3J0ZXMpDQoNCmBgYA0KDQoNCiMjIENyaWHDp8OjbyBkb3MgUENBDQoNCmBgYHtyfQ0KcGMxIDwtIHByaW5jaXBhbChkYXRhX3NjYWxlZFssIGNvbHVuYXNfZm9ydGVzXSwgbmZhY3RvcnM9bGVuZ3RoKGNvbHVuYXNfZm9ydGVzKSwgcm90YXRlPSJub25lIikNCnBjMSRsb2FkaW5ncw0KYGBgDQoNCmBgYHtyfQ0KcGxvdChwYzEkdmFsdWVzLCB0eXBlID0gImIiLCBtYWluID0gIlNjcmVlIHBsb3QgZm9yIERlc2VtcGVuaG8gYWNhZMOqbWljbyIsDQogICAgIHhsYWIgPSAiTnVtYmVyIG9mIFBDIiwgeWxhYiA9ICJFaWdlbnZhbHVlIikNCmBgYA0KDQoNCmBgYHtyfQ0Kcm91bmQocGMxJHZhbHVlcywzKQ0Kcm91bmQocGMxJGNvbW11bmFsaXR5LDMpDQpgYGANCg0KYGBge3J9DQojQXNzdW1lIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyA9IDM0DQpwYzM0IDwtIHByaW5jaXBhbChkYXRhX3NjYWxlZCwgbmZhY3RvcnM9Mywgcm90YXRlPSJub25lIikNCnBjMzQkbG9hZGluZ3MNCg0KI1NjcmVlcGxvdCAtIEZpbmQgdGhlIGVsYm93DQpwbG90KHBjMzQkdmFsdWVzLCB0eXBlID0gImIiLCBtYWluID0gIlNjcmVlIHBsb3QgZm9yIEZJRkExOSBkYXRhc2V0IiwNCiAgICAgeGxhYiA9ICJOdW1iZXIgb2YgUEMiLCB5bGFiID0gIkVpZ2VudmFsdWUiKSANCg0KI0VpZ2VudmFsdWVzIC0gVmFyaWFuY2VzIG9mIHRoZSBwcmluY2lwYWwgY29tcG9uZW50cyANCnJvdW5kKHBjMzQkdmFsdWVzLDMpDQoNCiNVc2luZyBLYWlzZXIgY3JpdGVyaW9uICg5IGNvbXBvbmVudCBzb2x1dGlvbikNCiM1IGNvbXBvbmVudCBzb2x1dGlvbiB3aXRob3V0IHJvdGF0aW9uDQpwYzkgPC0gcHJpbmNpcGFsKGRhdGFfc2NhbGVkLCBuZmFjdG9ycz05LCByb3RhdGU9Im5vbmUiLCBzY29yZXM9VFJVRSkNCg0KI2NvbW11bmFsaXR5IG9mIDUgY29tcG9uZW50IHNvbHV0aW9uDQpyb3VuZChwYzkkY29tbXVuYWxpdHksMykNCg0KIzUgY29tcG9uZW50IHNvbHV0aW9uIHdpdGggcm90YXRpb24gKHZhcmltYXgpDQpwYzlyIDwtIHByaW5jaXBhbChkYXRhX3NjYWxlZCwgbmZhY3RvcnM9OSwgcm90YXRlPSJ2YXJpbWF4IikNCnBjOXIkbG9hZGluZ3MNCmBgYA0K